﻿using System;
using System.Net;
using System.Windows.Forms;
using ChaterFuncLib;
using System.Collections.Generic;
using System.Collections;

namespace ChaterServer
{
    public class Terminal
    {
        ChattingCore core;

        /// <summary>
        /// Обработчик команд
        /// </summary>
        /// <param name="cmd">Команда с аргументами</param>
        public void ParseCommand(string cmd)
        {
            if (cmd.StartsWith("start server"))
                HandleStartServerCommand(cmd);

            else if (cmd.StartsWith("stop server"))
                HandleStopServerCommand();

            else if (cmd.StartsWith("help"))
                HandleHelpCommand();

            else
                core.LogMessage("Неопознанная команда!", ChattingCore.LogMessageType.Error, ChattingCore.LogLevel.Standart);
        }

        /// <summary>
        /// Команда start server
        /// </summary>
        /// <param name="cmd">Вся команда с аргументами</param>
        private void HandleStartServerCommand(string cmd)
        {
            if (cmd.Length <= 13)
            {
                core.LogMessage("Отсутствует аргумент!", ChattingCore.LogMessageType.Error, ChattingCore.LogLevel.Standart);
                HandleStartServerHelp();
                return;
            }
            string command = cmd.Substring(13);
            string ipstr = string.Empty;

            for (int i = 0; i < command.Length; i++)
            {
                if (char.IsNumber(command[i]) || command[i] == '.')
                    ipstr += command[i].ToString();

                if (char.IsWhiteSpace(command[i]))
                {
                    command = command.Substring(i + 1);
                    break;
                }
            }

            bool mysqlparam = false;

            for (int i = 0; i < command.Length; i++)
                if (char.IsWhiteSpace(command[i]))
                    mysqlparam = true;

            string sqlhost = string.Empty;
            string db = string.Empty;
            string user = string.Empty;
            string pass = string.Empty;
            IPAddress sqlip = null;

            if (mysqlparam)
            {
                string connstring = string.Empty;

                for (int i = 0; i < command.Length; i++)
                {
                    if (char.IsWhiteSpace(command[i]))
                    {
                        connstring = command.Substring(i + 1);
                        command = command.Substring(0, i);
                        break;
                    }
                }

                for (int i = 0; i < connstring.Length; i++)
                {
                    if (char.IsNumber(connstring[i]) || connstring[i] == '.')
                        sqlhost += connstring[i].ToString();

                    if (char.IsWhiteSpace(connstring[i]))
                    {
                        connstring = connstring.Substring(i + 1);
                        break;
                    }
                }

                for (int i = 0; i < connstring.Length; i++)
                {
                    if (!char.IsWhiteSpace(connstring[i]))
                        db += connstring[i].ToString();
                    else
                    {
                        connstring = connstring.Substring(i + 1);
                        break;
                    }
                }

                for (int i = 0; i < connstring.Length; i++)
                {
                    if (!char.IsWhiteSpace(connstring[i]))
                        user += connstring[i].ToString();
                    else
                    {
                        connstring = connstring.Substring(i + 1);
                        break;
                    }
                }

                for (int i = 0; i < connstring.Length; i++)
                {
                    if (!char.IsWhiteSpace(connstring[i]))
                        pass += connstring[i].ToString();
                    else
                    {
                        connstring = connstring.Substring(i + 1);
                        break;
                    }
                }

                if (!IPAddress.TryParse(sqlhost, out sqlip))
                {
                    core.LogMessage("MySQL: Некорректный IP-адрес!", ChattingCore.LogMessageType.Error, ChattingCore.LogLevel.Standart);
                    HandleStartServerHelp();
                    return;
                }
            }

            IPAddress ip;
            uint port;

            if (!IPAddress.TryParse(ipstr, out ip))
            {
                core.LogMessage("Некорректный IP-адрес!", ChattingCore.LogMessageType.Error, ChattingCore.LogLevel.Standart);
                HandleStartServerHelp();
                return;
            }

            if (!uint.TryParse(command, out port) || !Service.isPort(port))
            {
                core.LogMessage("Некорректный порт!", ChattingCore.LogMessageType.Warning, ChattingCore.LogLevel.Standart);
                HandleStartServerHelp();
                return;
            }

            if (mysqlparam)
                core.StartServer(ip, port, sqlip, db, user, pass);
            else
                core.StartServer(ip, port);
        }

        /// <summary>
        /// Команда stop server
        /// </summary>
        private void HandleStopServerCommand()
        {
            core.StopServer();
        }

        /// <summary>
        /// Команда help
        /// </summary>
        private void HandleHelpCommand()
        {
            core.LogMessage("Доступные команды: ", ChattingCore.LogMessageType.Warning, ChattingCore.LogLevel.Standart);
            core.LogMessage("start server", ChattingCore.LogMessageType.Warning, ChattingCore.LogLevel.Standart);
            core.LogMessage("stop server", ChattingCore.LogMessageType.Warning, ChattingCore.LogLevel.Standart);
            core.LogMessage("help", ChattingCore.LogMessageType.Warning, ChattingCore.LogLevel.Standart);
        }

        /// <summary>
        /// Справка по команде start server
        /// </summary>
        private void HandleStartServerHelp()
        {
            core.LogMessage("Использование команды start server:", ChattingCore.LogMessageType.Warning, ChattingCore.LogLevel.Standart);
            core.LogMessage("start server IP Port", ChattingCore.LogMessageType.Warning, ChattingCore.LogLevel.Standart);
            core.LogMessage("Например: start server 127.0.0.1 1234", ChattingCore.LogMessageType.Warning, ChattingCore.LogLevel.Standart);
            core.LogMessage("Используйте промежуток портов от 0 до 65535", ChattingCore.LogMessageType.Warning, ChattingCore.LogLevel.Standart);
            core.LogMessage("========================================================================================================", ChattingCore.LogMessageType.Warning, ChattingCore.LogLevel.Standart);
            core.LogMessage("Если вы хотите в список аргументов также включить настройки MySQL, то:", ChattingCore.LogMessageType.Warning, ChattingCore.LogLevel.Standart);
            core.LogMessage("start server IP Port MySQL_IP MySQL_Database MySQL_Username MySQL_Password", ChattingCore.LogMessageType.Warning, ChattingCore.LogLevel.Standart);
            core.LogMessage("Например: start server 127.0.0.1 1234 127.0.0.1 chater root qwerty", ChattingCore.LogMessageType.Warning, ChattingCore.LogLevel.Standart);
            core.LogMessage("Сервер будет принимать подключения аналогично первому варианту, а подключение MySQL будет настроено на указанный адрес и порт 3306, в случае примера на 127.0.0.1:3306", ChattingCore.LogMessageType.Warning, ChattingCore.LogLevel.Standart);
        }

        /// <summary>
        /// Конструктор класса Terminal
        /// </summary>
        /// <param name="log">Объект TextBox для логирования</param>
        public Terminal(ChattingCore core)
        {
            this.core = core;
        }
    }
}